package cn.vehicle.service.impl;

import cn.vehicle.domains.bo.QueryCommonVehicleBo;
import cn.vehicle.domains.entity.CommonVehicleEntity;
import cn.vehicle.exception.VehicleAccessException;
import cn.vehicle.mapper.CommonVehicleMapper;
import cn.vehicle.service.CommonVehicleService;
import jakarta.annotation.Resource;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 普通车辆服务实现类
 * <p>
 * 负责普通车辆的持久化操作，包括新增、修改、删除、查询及分页查询。
 * 通过 {@link CommonVehicleMapper} 实现与数据库的交互，是 Service 层的核心实现。
 * </p>
 *
 * <p>主要职责：</p>
 * <ul>
 *   <li>封装普通车辆表的基础增删改查逻辑；</li>
 *   <li>捕获数据库异常并转化为业务异常 {@link VehicleAccessException}；</li>
 *   <li>为业务逻辑层（Biz 层）提供稳定的数据访问支持。</li>
 * </ul>
 */
@Service
public class CommonVehicleServiceImpl implements CommonVehicleService {

    @Resource
    private CommonVehicleMapper commonVehicleMapper;

    /**
     * 新增普通车辆
     *
     * @param commonVehicleEntity 普通车辆实体对象
     * @throws VehicleAccessException 当车辆已存在（唯一键冲突）时抛出
     */
    @Override
    public void addCommonVehicle(CommonVehicleEntity commonVehicleEntity) {
        try {
            // 插入普通车辆数据，若主键或唯一索引冲突则抛出异常
            commonVehicleMapper.insertVehicle(commonVehicleEntity);
        } catch (DuplicateKeyException e) {
            // 捕获数据库唯一键异常并转换为业务异常
            throw VehicleAccessException.DATE_EXIST.newInstance("车辆已存在");
        }
    }

    /**
     * 更新普通车辆信息
     *
     * @param updateEntity 更新的车辆实体
     * @throws VehicleAccessException 若更新失败（未更新到记录）则抛出异常
     */
    @Override
    public void updateCommonVehicle(CommonVehicleEntity updateEntity) {
        // 执行部分字段更新（仅更新非空字段）
        int i = commonVehicleMapper.updateVehicleSelective(updateEntity);
        // 若未更新到任何数据，说明目标记录不存在
        if (i != 1) {
            throw VehicleAccessException.DATE_NOT_EXIST.newInstance("更新车辆未更新到数据");
        }
    }

    /**
     * 根据ID查询普通车辆
     *
     * @param id 普通车辆主键ID
     * @return 普通车辆实体对象
     */
    @Override
    public CommonVehicleEntity getCommonVehicleById(Long id) {
        return commonVehicleMapper.selectVehicleById(id);
    }

    /**
     * 删除普通车辆
     *
     * @param id 普通车辆主键ID
     * @throws VehicleAccessException 若删除失败（未找到记录）则抛出异常
     */
    @Override
    public void deleteCommonVehicle(Long id) {
        // 执行按主键删除操作
        int i = commonVehicleMapper.deleteVehicleById(id);
        // 若未删除任何记录，说明目标车辆不存在
        if (i != 1) {
            throw VehicleAccessException.DATE_NOT_EXIST.newInstance("删除车辆未删除到数据");
        }
    }

    /**
     * 查询普通车辆列表
     *
     * @param queryCommonVehicleBo 查询条件封装对象
     * @return 普通车辆实体列表
     */
    @Override
    public List<CommonVehicleEntity> selectCommonVehicleList(QueryCommonVehicleBo queryCommonVehicleBo) {
        // 根据查询条件执行列表查询
        return commonVehicleMapper.selectVehicleList(queryCommonVehicleBo);
    }

    /**
     * 根据关联ID查询普通车辆
     *
     * @param id 关联ID
     * @return 普通车辆实体对象
     */
    @Override
    public CommonVehicleEntity getCommonVehicleByAssociationId(Long id) {
        // 通过外部关联ID查询普通车辆信息
        return commonVehicleMapper.selectCommonVehicleByAssociationId(id);
    }

    @Override
    public CommonVehicleEntity getCommonVehicleByVehicleNumber(String vehicleNumber) {
        return commonVehicleMapper.selectVehicleByNumber(vehicleNumber);
    }
}
